﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Sql;
using System.Collections;
using System.Data.SqlClient;
using System.IO;

namespace Crear_SPs_DML
{
    public partial class Form1 : Form
    {
        SqlDataSourceEnumerator servidores;
        System.Data.DataTable tablaServidores;
        string servidor;
        string NameSpCrearSPs_DML = "spCrearSPs_DML";
        DataTable dt = null;

        public Form1()
        {
            InitializeComponent();
            servidores = SqlDataSourceEnumerator.Instance;
            tablaServidores = new DataTable();
        }

        private void comboBoxServidores_Click(object sender, EventArgs e)
        {
            if (this.comboBoxServidores.Items.Count > 0)
            {
                return;
            }

            Cursor.Current = Cursors.WaitCursor;
            try
            {
                // Obtenemos un dataTable con la información sobre las instancias visibles
                // de SQL Server 2000 y 2005
                tablaServidores = servidores.GetDataSources();


                // Creamos una lista para que sea el origen de datos del combobox
                ArrayList listaServidores = new ArrayList();


                // Recorremos el dataTable y añadimos un valor nuevo a la lista con cada fila
                foreach (DataRow rowServidor in tablaServidores.Rows)
                {

                    // La instancia de SQL Server puede tener nombre de instancia 
                    //o únicamente el nombre del servidor, comprobamos si hay 
                    //nombre de instancia para mostrarlo
                    if (String.IsNullOrEmpty(rowServidor["InstanceName"].ToString()))
                        listaServidores.Add(rowServidor["ServerName"].ToString());
                    else
                        listaServidores.Add(rowServidor["ServerName"] + "\\" + rowServidor["InstanceName"]);
                }

                // Asignamos al origen de datos del combobox la lista con 
                // las instancias de servidores
                this.comboBoxServidores.DataSource = listaServidores;
            }
            catch (Exception Ex)
            {
                MessageBox.Show(Ex.Message);
            }
            Cursor.Current = Cursors.Default;
        }

        private void comboBoxBasesdeDatos_Click(object sender, EventArgs e)
        {
            ArrayList listaBasesdatos = new ArrayList();
            
            if (this.comboBoxBasesdeDatos.Items.Count > 0)
            {
                return;
            }

            Cursor.Current = Cursors.WaitCursor;
            
            try
            {
                Cursor.Current = Cursors.WaitCursor;
                this.servidor = this.comboBoxServidores.Text;

                dt = this.consultar("select name from sys.databases;");
                foreach (DataRow row in dt.Rows)
                {
                    listaBasesdatos.Add(row[0].ToString());
                }
                // Asignamos la lista de bases de datos como origen de datos del combobox
                this.comboBoxBasesdeDatos.DataSource = listaBasesdatos;
            }
            catch (Exception Ex)
            {
                MessageBox.Show(Ex.Message);
            }
            Cursor.Current = Cursors.Default;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ArrayList listaTablas = new ArrayList();
            
            //System.Data.SqlClient.SqlDataReader dr2 = null;

            ///--- Probar la conexion y verificar si el procedimientoq ue se encargara de crear los Procedimientos DML en la base de datos se encuentra en la BD
            Cursor.Current = Cursors.WaitCursor;

            try
            {
                // Obtenemos el nombre del sp en cuestion
                dt = this.consultar("SELECT name FROM SYSOBJECTS WHERE name='" + this.NameSpCrearSPs_DML + "' and XTYPE='P';");

                
                if (dt.Rows.Count==0)
                {
                    MessageBox.Show("El procedimiento almacenado '" + this.NameSpCrearSPs_DML + "' No se encuentra creado en la BD, debe crearlo para continuar");
                    return;
                }
                
                // Obtenemos La lista de tablas
                dt = this.consultar("SELECT name FROM SYSOBJECTS WHERE XTYPE='U' ORDER BY name;");

                foreach(DataRow row in dt.Rows)
                {
                    listaTablas.Add(row[0].ToString());
                }
                // Asignamos la lista de Tablas como origen de datos del combobox
                this.comboBoxTablas.DataSource = listaTablas;
                this.panelConexion.Enabled = false;
                this.panelTablas.Enabled = true;
            }
            catch (Exception Ex)
            {
                MessageBox.Show(Ex.Message);
            }            

            Cursor.Current = Cursors.Default;
        }

        private void buttonGenerar_Click(object sender, EventArgs e)
        {
            try
            {
                Cursor.Current = Cursors.WaitCursor;
                this.servidor = this.comboBoxServidores.Text;

                dt = this.consultar("EXEC dbo.[" + this.NameSpCrearSPs_DML.Trim() + "] @table_name='" + this.comboBoxTablas.Text + "', @unique_column=NULL, @delete=" + (this.checkBoxDelete.Checked ? "1" : "0") + ", @insert=" + (this.checkBoxInsert.Checked ? "1" : "0") + ", @select=" + (this.checkBoxSelect.Checked ? "1" : "0") + ",@update=" + (this.checkBoxUpdate.Checked ? "1" : "0") + ",@prefijoSP='" + this.textBoxPrefijo.Text.Trim() + "',@CrearSPsEnBD=" + (this.checkBoxCrearEnBD.Checked ? "1" : "0") + ",@Encriptar=" + (this.checkBoxEncriptar.Checked ? "1" : "0") + "");
                
                //-- 
                SaveFileDialog saveFileDialog = new SaveFileDialog();
                string[] lineas;
                char[] c = { '\n' };
                saveFileDialog.Filter = "(*.sql)|*.sql";//"txt files (*.txt)|*.txt|All files (*.*)|*.*";
                saveFileDialog.FilterIndex = 0;
                    
                foreach(DataRow row in dt.Rows)
                {
                    saveFileDialog.FileName = row["nombre"].ToString();
                    saveFileDialog.RestoreDirectory = true;
                    if (saveFileDialog.ShowDialog() == DialogResult.OK)
                    {
                        lineas = row["codigo"].ToString().Split(c);
                        //--- Creo el archivo 
                        using (StreamWriter sw = new StreamWriter(saveFileDialog.FileName))
                        {
                            for (int i = 0; i < lineas.Length; i++)
                            {
                                sw.WriteLine(lineas[i].TrimEnd());
                            }
                        }
                    }
                }
            }
            catch (Exception Ex)
            {
                MessageBox.Show(Ex.Message);
            }
            Cursor.Current = Cursors.Default;
        }

        private void buttonGenerarTodos_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Desea generar los archivos para todas las tablas de la BD?", "", MessageBoxButtons.YesNo) == DialogResult.No)
            {
                return;
            }

            try
            {
                Cursor.Current = Cursors.WaitCursor;
                this.servidor = this.comboBoxServidores.Text;

                //-- 
                SaveFileDialog saveFileDialog = new SaveFileDialog();
                string[] lineas;
                char[] c = { '\n' };
                saveFileDialog.Filter = "(*.sql)|*.sql";//"txt files (*.txt)|*.txt|All files (*.*)|*.*";
                saveFileDialog.FilterIndex = 0;
                foreach (string item in this.comboBoxTablas.Items)
                {
                    dt = this.consultar("EXEC dbo.[" + this.NameSpCrearSPs_DML.Trim() + "] @table_name='" + item.ToString() + "', @unique_column=NULL, @delete=" + (this.checkBoxDelete.Checked ? "1" : "0") + ", @insert=" + (this.checkBoxInsert.Checked ? "1" : "0") + ", @select=" + (this.checkBoxSelect.Checked ? "1" : "0") + ",@update=" + (this.checkBoxUpdate.Checked ? "1" : "0") + ",@prefijoSP='" + this.textBoxPrefijo.Text.Trim() + "',@CrearSPsEnBD=" + (this.checkBoxCrearEnBD.Checked ? "1" : "0") + ",@Encriptar=" + (this.checkBoxEncriptar.Checked ? "1" : "0") + "");

                    foreach (DataRow row in dt.Rows)
                    {
                        saveFileDialog.FileName = row["nombre"].ToString();
                        saveFileDialog.RestoreDirectory = true;
                        if (saveFileDialog.ShowDialog() == DialogResult.OK)
                        {
                            lineas = row["codigo"].ToString().Split(c);
                            //--- Creo el archivo 
                            using (StreamWriter sw = new StreamWriter(saveFileDialog.FileName))
                            {
                                for (int i = 0; i < lineas.Length; i++)
                                {
                                    sw.WriteLine(lineas[i].TrimEnd());
                                }
                            }
                        }
                    }
                }

                
            }
            catch (Exception Ex)
            {
                MessageBox.Show(Ex.Message);
            }
            Cursor.Current = Cursors.Default;
        }
        
        private DataTable consultar(string Query)
        {
            string cadenaConexion= "Data Source=" + this.comboBoxServidores.Text.Trim() + ";Initial Catalog=" + this.comboBoxBasesdeDatos.Text.Trim() + ";Persist Security Info=True;User ID=" + this.textBoxUser.Text.Trim() + ";Password=" + this.textBoxPass.Text.Trim() + "";
            DataTable dt = new DataTable();
            //try
            //{
                using (System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(cadenaConexion))
                {
                    con.Open();
                    SqlCommand command = con.CreateCommand();
                    command.Connection = con;
                    command.CommandText = Query;
                    dt.Load(command.ExecuteReader());
                    con.Close();
                    return dt;
                }
            //}
            //catch (Exception Ex)
            //{
            //    MessageBox.Show(Ex.Message);
            //    return null;
            //}            
        }
    }
}
